library(readxl)

setwd("/Users/karlavasco/Library/CloudStorage/OneDrive-MichiganStateUniversity/Manning_lab/Metabolomics_mastitis/tables")
feature_id <- read_excel("metabolomics_microbiome_fc_2023.xlsx", sheet = "feature_id")
features <- read_excel("metabolomics_microbiome_fc_2023.xlsx", sheet = "features")
metadata <- read_excel("metabolomics_microbiome_fc_2023.xlsx", sheet = "metadata")
library(dplyr)
library(tibble)
setwd("/Users/karlavasco/Library/CloudStorage/OneDrive-MichiganStateUniversity/Manning_lab/Metabolomics_mastitis/tables")

diff_all <- features %>% column_to_rownames("features") %>% t() %>% as.data.frame() %>% rownames_to_column(var="sample_ID") %>% merge(metadata, by="sample_ID")
matrix_diff <- diff_all %>% remove_rownames() %>% column_to_rownames(var="sample_ID")
matrix_diff=as.matrix(matrix_diff)
class(matrix_diff) <- "numeric"
Warning: NAs introduced by coercion
matrix_diff[is.na(matrix_diff)] = 0
#ANNOTATION COLUMNS
anno_row <- diff_all %>% 
  dplyr::select(Treatment,Time_tx)

rownames(anno_row)= rownames(as.data.frame(matrix_diff))

anno_row <- as.data.frame(anno_row)

anno_color <- list(Treatment = c(Antibiotic = "#DF8F44FF", Control = "#374E55FF"),
                   Time_tx = c(`Week 1` = "#EE0000FF", `Day -1` = "#3B4992FF", `Week 9` = "#008B45FF"))
library(pheatmap)
library(viridis) #color pallet, it's optional
library(RColorBrewer)

#HEATMAP RA USING ln color pallet RBrewer
heatmap_metIDs <- pheatmap(
    #mat               = t(matrix_diff),
    mat               = log10(t(matrix_diff+0.0000001)),
  border_color      = NA,
  show_colnames     = T,
  show_rownames     = T,
  angle_col = 90,
  drop_levels       = TRUE,
  fontsize_col = 4,
  fontsize_row = 5,
  fontsize          = 14,
  color             = brewer.pal(9,"Reds"),
  number_color = NA,
 annotation_col  = anno_row,
  annotation_colors = anno_color,
  annotation_names_col = T,
  annotation_names_row = T,
  cluster_cols = T,
  cluster_rows = T,
 clustering_method = "ward.D",
  gaps_row = FALSE
 )
Warning: NaNs produced
heatmap_metIDs

setwd("/Users/karlavasco/Library/CloudStorage/OneDrive-MichiganStateUniversity/Manning_lab/Metabolomics_mastitis/tables")
matrix_features <- read_excel("metabolomics_microbiome_fc.xlsx", sheet = "features")%>% remove_rownames %>% column_to_rownames(var="features")
matrix_features=as.matrix(matrix_features)
class(matrix_diff) <- "numeric"
matrix_diff[is.na(matrix_diff)] = 0
hc <- hclust(dist(matrix_features), "ward.D")
plot(hc, cex =.5)

hc_groups <- as.data.frame(cutree(hc, k = 30)) %>% tibble::rownames_to_column("features") %>% rename(hc_group = 2)
hc_groups %>% count(hc_group)

#Number of clusters

library("NbClust")
nb <- NbClust(diss = dist(matrix_features), distance = NULL, min.nc = 2,
        max.nc = 50, method = "ward.D",index = "silhouette")

 Only frey, mcclain, cindex, sihouette and dunn can be computed. To compute the other indices, data matrix is needed 
library(janitor)
library(tidyr)
diff <- as.data.frame(matrix_features) %>% rownames_to_column("features") 
df_hc_merge <- merge(diff, hc_groups, by = "features")
df_hc <- df_hc_merge %>% gather(sample_ID, abundance, -c(features,hc_group)) 
#metadata <- metadata %>% rename(sample_ID = ID)
df_hc_meta <- merge(df_hc, metadata, by="sample_ID")
df_hc_meta$abundance <- as.numeric(as.character(df_hc_meta$abundance))
df_hc_meta_type <- merge(df_hc_meta, feature_id, by="features")

hc2 <- df_hc_meta_type %>% 
  filter(hc_group==2, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ylim(0,15)
hc2

hc4 <- df_hc_meta_type %>% 
  filter(hc_group==4, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ylim(0,5)
hc4

hc5 <- df_hc_meta_type %>% 
  filter(hc_group==5, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc5

hc6 <- df_hc_meta_type %>% 
  filter(hc_group==6, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ylim(0,5)
hc6

hc7 <- df_hc_meta_type %>% 
  filter(hc_group==7, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc7

hc8 <- df_hc_meta_type %>% 
  filter(hc_group==8, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc8

hc9 <- df_hc_meta_type %>% 
  filter(hc_group==9, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ylim(0,10)
hc9

hc10 <- df_hc_meta_type %>% 
  filter(hc_group==10, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc10

hc11 <- df_hc_meta_type %>% 
  filter(hc_group==11, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ 
  theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc11

hc12 <- df_hc_meta_type %>% 
  filter(hc_group==12, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ 
  theme(legend.text=element_text(size=7))  + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc12

hc14 <- df_hc_meta_type %>% 
  filter(hc_group==14, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx",panel.labs = list(Time_tx=c("Lactation","Dry-off","Fresh cows"))) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+  guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + scale_fill_manual(values=c("#DF8F44FF","#B24745FF")) + scale_color_manual(values=c("#DF8F44FF","#B24745FF"))
hc14

hc15 <- df_hc_meta_type %>% 
  filter(hc_group==15, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ 
  theme(legend.text=element_text(size=7))  + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1)) + ylim(0,10)
hc15

hc28 <- df_hc_meta_type %>% 
  filter(hc_group==14, Time_tx%in%c("Day -1","Week 1","Week 9")) %>% 
  ggboxplot(x="features",y="abundance",fill = "Type",color = "Type", ylab = "Mean proportion", alpha = 0.5, notch = F,legend = "right",facet.by = "Time_tx", palette = get_palette(palette = "jama",5)) + theme(axis.ticks.x = element_blank(), axis.title.x = element_blank())+ theme(legend.text=element_text(size=5)) + guides(fill=guide_legend(ncol=1),color=guide_legend(ncol=1))+ 
  theme(legend.text=element_text(size=7)) + theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
hc28

setwd("/Users/karlavasco/Library/CloudStorage/OneDrive-MichiganStateUniversity/Manning_lab/Metabolomics_mastitis/figures")
#ggsave(plot=hc1,"hc1_multiomics.png",width = 16, height = 8)
ggsave(plot=hc2,"hc2_multiomics.png",width = 30, height = 20)
#ggsave(plot=hc3,"hc3_multiomics.png",width = 20, height = 20)
#ggsave(plot=hc4,"hc4_multiomics.png",width = 16, height = 8)
ggsave(plot=hc5,"hc5_multiomics.png",width = 30, height = 20)
#ggsave(plot=hc14,"hc14_multiomics.png",width = 16, height = 20)
#ggsave(plot=hc15,"hc15_multiomics.png",width = 16, height = 20)
setwd("/Users/karlavasco/Library/CloudStorage/OneDrive-MichiganStateUniversity/Manning_lab/Metabolomics_mastitis/figures")

hc_bars <- ggarrange(hc1,hc14,hc3,labels = c("A","B","C"),nrow = 3, ncol = 1)
ggsave(plot=hc_bars,"hc_bars_fc_multiomics.png",width = 15, height = 15)
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeShyZWFkeGwpCgpzZXR3ZCgiL1VzZXJzL2thcmxhdmFzY28vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtTWljaGlnYW5TdGF0ZVVuaXZlcnNpdHkvTWFubmluZ19sYWIvTWV0YWJvbG9taWNzX21hc3RpdGlzL3RhYmxlcyIpCmZlYXR1cmVfaWQgPC0gcmVhZF9leGNlbCgibWV0YWJvbG9taWNzX21pY3JvYmlvbWVfZmNfMjAyMy54bHN4Iiwgc2hlZXQgPSAiZmVhdHVyZV9pZCIpCmZlYXR1cmVzIDwtIHJlYWRfZXhjZWwoIm1ldGFib2xvbWljc19taWNyb2Jpb21lX2ZjXzIwMjMueGxzeCIsIHNoZWV0ID0gImZlYXR1cmVzIikKbWV0YWRhdGEgPC0gcmVhZF9leGNlbCgibWV0YWJvbG9taWNzX21pY3JvYmlvbWVfZmNfMjAyMy54bHN4Iiwgc2hlZXQgPSAibWV0YWRhdGEiKQpgYGAKCgpgYGB7cn0KbGlicmFyeShkcGx5cikKbGlicmFyeSh0aWJibGUpCnNldHdkKCIvVXNlcnMva2FybGF2YXNjby9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9PbmVEcml2ZS1NaWNoaWdhblN0YXRlVW5pdmVyc2l0eS9NYW5uaW5nX2xhYi9NZXRhYm9sb21pY3NfbWFzdGl0aXMvdGFibGVzIikKCmRpZmZfYWxsIDwtIGZlYXR1cmVzICU+JSBjb2x1bW5fdG9fcm93bmFtZXMoImZlYXR1cmVzIikgJT4lIHQoKSAlPiUgYXMuZGF0YS5mcmFtZSgpICU+JSByb3duYW1lc190b19jb2x1bW4odmFyPSJzYW1wbGVfSUQiKSAlPiUgbWVyZ2UobWV0YWRhdGEsIGJ5PSJzYW1wbGVfSUQiKQptYXRyaXhfZGlmZiA8LSBkaWZmX2FsbCAlPiUgcmVtb3ZlX3Jvd25hbWVzKCkgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXI9InNhbXBsZV9JRCIpCm1hdHJpeF9kaWZmPWFzLm1hdHJpeChtYXRyaXhfZGlmZikKY2xhc3MobWF0cml4X2RpZmYpIDwtICJudW1lcmljIgptYXRyaXhfZGlmZltpcy5uYShtYXRyaXhfZGlmZildID0gMApgYGAKCmBgYHtyfQojQU5OT1RBVElPTiBDT0xVTU5TCmFubm9fcm93IDwtIGRpZmZfYWxsICU+JSAKICBkcGx5cjo6c2VsZWN0KFRyZWF0bWVudCxUaW1lX3R4KQoKcm93bmFtZXMoYW5ub19yb3cpPSByb3duYW1lcyhhcy5kYXRhLmZyYW1lKG1hdHJpeF9kaWZmKSkKCmFubm9fcm93IDwtIGFzLmRhdGEuZnJhbWUoYW5ub19yb3cpCgphbm5vX2NvbG9yIDwtIGxpc3QoVHJlYXRtZW50ID0gYyhBbnRpYmlvdGljID0gIiNERjhGNDRGRiIsIENvbnRyb2wgPSAiIzM3NEU1NUZGIiksCiAgICAgICAgICAgICAgICAgICBUaW1lX3R4ID0gYyhgV2VlayAxYCA9ICIjRUUwMDAwRkYiLCBgRGF5IC0xYCA9ICIjM0I0OTkyRkYiLCBgV2VlayA5YCA9ICIjMDA4QjQ1RkYiKSkKYGBgCgoKYGBge3IgZmlnLmhlaWdodD0zMH0KbGlicmFyeShwaGVhdG1hcCkKbGlicmFyeSh2aXJpZGlzKSAjY29sb3IgcGFsbGV0LCBpdCdzIG9wdGlvbmFsCmxpYnJhcnkoUkNvbG9yQnJld2VyKQoKI0hFQVRNQVAgUkEgVVNJTkcgbG4gY29sb3IgcGFsbGV0IFJCcmV3ZXIKaGVhdG1hcF9tZXRJRHMgPC0gcGhlYXRtYXAoCiAgICAjbWF0ICAgICAgICAgICAgICAgPSB0KG1hdHJpeF9kaWZmKSwKICAgIG1hdCAgICAgICAgICAgICAgID0gbG9nMTAodChtYXRyaXhfZGlmZiswLjAwMDAwMDEpKSwKICBib3JkZXJfY29sb3IgICAgICA9IE5BLAogIHNob3dfY29sbmFtZXMgICAgID0gVCwKICBzaG93X3Jvd25hbWVzICAgICA9IFQsCiAgYW5nbGVfY29sID0gOTAsCiAgZHJvcF9sZXZlbHMgICAgICAgPSBUUlVFLAogIGZvbnRzaXplX2NvbCA9IDQsCiAgZm9udHNpemVfcm93ID0gNSwKICBmb250c2l6ZSAgICAgICAgICA9IDE0LAogIGNvbG9yICAgICAgICAgICAgID0gYnJld2VyLnBhbCg5LCJSZWRzIiksCiAgbnVtYmVyX2NvbG9yID0gTkEsCiBhbm5vdGF0aW9uX2NvbCAgPSBhbm5vX3JvdywKICBhbm5vdGF0aW9uX2NvbG9ycyA9IGFubm9fY29sb3IsCiAgYW5ub3RhdGlvbl9uYW1lc19jb2wgPSBULAogIGFubm90YXRpb25fbmFtZXNfcm93ID0gVCwKICBjbHVzdGVyX2NvbHMgPSBULAogIGNsdXN0ZXJfcm93cyA9IFQsCiBjbHVzdGVyaW5nX21ldGhvZCA9ICJ3YXJkLkQiLAogIGdhcHNfcm93ID0gRkFMU0UKICkKaGVhdG1hcF9tZXRJRHMKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTIwfQpzZXR3ZCgiL1VzZXJzL2thcmxhdmFzY28vTGlicmFyeS9DbG91ZFN0b3JhZ2UvT25lRHJpdmUtTWljaGlnYW5TdGF0ZVVuaXZlcnNpdHkvTWFubmluZ19sYWIvTWV0YWJvbG9taWNzX21hc3RpdGlzL3RhYmxlcyIpCm1hdHJpeF9mZWF0dXJlcyA8LSByZWFkX2V4Y2VsKCJtZXRhYm9sb21pY3NfbWljcm9iaW9tZV9mYy54bHN4Iiwgc2hlZXQgPSAiZmVhdHVyZXMiKSU+JSByZW1vdmVfcm93bmFtZXMgJT4lIGNvbHVtbl90b19yb3duYW1lcyh2YXI9ImZlYXR1cmVzIikKbWF0cml4X2ZlYXR1cmVzPWFzLm1hdHJpeChtYXRyaXhfZmVhdHVyZXMpCmNsYXNzKG1hdHJpeF9kaWZmKSA8LSAibnVtZXJpYyIKbWF0cml4X2RpZmZbaXMubmEobWF0cml4X2RpZmYpXSA9IDAKaGMgPC0gaGNsdXN0KGRpc3QobWF0cml4X2ZlYXR1cmVzKSwgIndhcmQuRCIpCnBsb3QoaGMsIGNleCA9LjUpCmhjX2dyb3VwcyA8LSBhcy5kYXRhLmZyYW1lKGN1dHJlZShoYywgayA9IDMwKSkgJT4lIHRpYmJsZTo6cm93bmFtZXNfdG9fY29sdW1uKCJmZWF0dXJlcyIpICU+JSByZW5hbWUoaGNfZ3JvdXAgPSAyKQpgYGAKCmBgYHtyfQpoY19ncm91cHMgJT4lIGNvdW50KGhjX2dyb3VwKQpgYGAKI051bWJlciBvZiBjbHVzdGVycwpgYGB7cn0KbGlicmFyeSgiTmJDbHVzdCIpCm5iIDwtIE5iQ2x1c3QoZGlzcyA9IGRpc3QobWF0cml4X2ZlYXR1cmVzKSwgZGlzdGFuY2UgPSBOVUxMLCBtaW4ubmMgPSAyLAogICAgICAgIG1heC5uYyA9IDUwLCBtZXRob2QgPSAid2FyZC5EIixpbmRleCA9ICJzaWxob3VldHRlIikKCmxpYnJhcnkoZmFjdG9leHRyYSkKZnZpel9uYmNsdXN0KG5iKSAKYGBgCgpgYGB7cn0KbGlicmFyeShqYW5pdG9yKQpsaWJyYXJ5KHRpZHlyKQpkaWZmIDwtIGFzLmRhdGEuZnJhbWUobWF0cml4X2ZlYXR1cmVzKSAlPiUgcm93bmFtZXNfdG9fY29sdW1uKCJmZWF0dXJlcyIpIApkZl9oY19tZXJnZSA8LSBtZXJnZShkaWZmLCBoY19ncm91cHMsIGJ5ID0gImZlYXR1cmVzIikKZGZfaGMgPC0gZGZfaGNfbWVyZ2UgJT4lIGdhdGhlcihzYW1wbGVfSUQsIGFidW5kYW5jZSwgLWMoZmVhdHVyZXMsaGNfZ3JvdXApKSAKI21ldGFkYXRhIDwtIG1ldGFkYXRhICU+JSByZW5hbWUoc2FtcGxlX0lEID0gSUQpCmRmX2hjX21ldGEgPC0gbWVyZ2UoZGZfaGMsIG1ldGFkYXRhLCBieT0ic2FtcGxlX0lEIikKZGZfaGNfbWV0YSRhYnVuZGFuY2UgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoZGZfaGNfbWV0YSRhYnVuZGFuY2UpKQpkZl9oY19tZXRhX3R5cGUgPC0gbWVyZ2UoZGZfaGNfbWV0YSwgZmVhdHVyZV9pZCwgYnk9ImZlYXR1cmVzIikKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEwfQpsaWJyYXJ5KGdncHVicikKI29yZGVyIDwtICBkZl9oY19tZXRhX3R5cGUgJT4lIGZpbHRlcihoY19ncm91cD09MSwgVGltZV90eCVpbiVjKCJEYXkgLTEiLCJXZWVrIDEiLCJXZWVrIDkiKSkgJT4lIGRwbHlyOjpzZWxlY3QgKGFidW5kYW5jZSxmZWF0dXJlcykgJT4lIGdyb3VwX2J5KGZlYXR1cmVzKSAlPiUgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihhYnVuZGFuY2UpKSAlPiUgYXJyYW5nZShtZWRpYW4pICU+JSBkcGx5cjo6c2VsZWN0KGZlYXR1cmVzKQpoYzEgPC0gZGZfaGNfbWV0YV90eXBlICU+JSAKICBmaWx0ZXIoaGNfZ3JvdXA9PTEsIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIsIHBhbGV0dGUgPSBnZXRfcGFsZXR0ZShwYWxldHRlID0gYygiIzM3NEU1NUZGIiwiI0RGOEY0NEZGIiwiIzAwQTFENUZGIikpLCBwYW5lbC5sYWJzID0gbGlzdChUaW1lX3R4PWMoIkxhY3RhdGlvbiIsIkRyeS1vZmYiLCJGcmVzaCBjb3dzIikpKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSArIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChuY29sPTEpLGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTEpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKaGMxCmBgYApgYGB7ciBmaWcuaGVpZ2h0PTE1fQpoYzIgPC0gZGZfaGNfbWV0YV90eXBlICU+JSAKICBmaWx0ZXIoaGNfZ3JvdXA9PTIsIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIsIHBhbGV0dGUgPSBnZXRfcGFsZXR0ZShwYWxldHRlID0gImphbWEiLDUpKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NSkpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5jb2w9MSksY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MSkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsgeWxpbSgwLDE1KQpoYzIKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KaGMzIDwtIGRmX2hjX21ldGFfdHlwZSAlPiUgCiAgZmlsdGVyKGhjX2dyb3VwPT0zLCBUaW1lX3R4JWluJWMoIkRheSAtMSIsIldlZWsgMSIsIldlZWsgOSIpKSAlPiUgCiAgZ2dib3hwbG90KHg9ImZlYXR1cmVzIix5PSJhYnVuZGFuY2UiLGZpbGwgPSAiVHlwZSIsY29sb3IgPSAiVHlwZSIsIHlsYWIgPSAiTWVhbiBwcm9wb3J0aW9uIiwgYWxwaGEgPSAwLjUsIG5vdGNoID0gRixsZWdlbmQgPSAicmlnaHQiLGZhY2V0LmJ5ID0gIlRpbWVfdHgiLCBwYWxldHRlID0gYygiI0RGOEY0NEZGIiwiIzAwQTFENUZGIiksIHBhbmVsLmxhYnMgPSBsaXN0KFRpbWVfdHg9YygiTGFjdGF0aW9uIiwiRHJ5LW9mZiIsIkZyZXNoIGNvd3MiKSkpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5jb2w9MSksY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MSkpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpoYzMKYGBgCmBgYHtyIGZpZy5oZWlnaHQ9MTV9CmhjNCA8LSBkZl9oY19tZXRhX3R5cGUgJT4lIAogIGZpbHRlcihoY19ncm91cD09NCwgVGltZV90eCVpbiVjKCJEYXkgLTEiLCJXZWVrIDEiLCJXZWVrIDkiKSkgJT4lIAogIGdnYm94cGxvdCh4PSJmZWF0dXJlcyIseT0iYWJ1bmRhbmNlIixmaWxsID0gIlR5cGUiLGNvbG9yID0gIlR5cGUiLCB5bGFiID0gIk1lYW4gcHJvcG9ydGlvbiIsIGFscGhhID0gMC41LCBub3RjaCA9IEYsbGVnZW5kID0gInJpZ2h0IixmYWNldC5ieSA9ICJUaW1lX3R4IiwgcGFsZXR0ZSA9IGdldF9wYWxldHRlKHBhbGV0dGUgPSAiamFtYSIsNSkpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSkgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobmNvbD0xKSxjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkrIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkgKyB5bGltKDAsNSkKaGM0CmBgYAoKCmBgYHtyIGZpZy5oZWlnaHQ9MTV9CmhjNSA8LSBkZl9oY19tZXRhX3R5cGUgJT4lIAogIGZpbHRlcihoY19ncm91cD09NSwgVGltZV90eCVpbiVjKCJEYXkgLTEiLCJXZWVrIDEiLCJXZWVrIDkiKSkgJT4lIAogIGdnYm94cGxvdCh4PSJmZWF0dXJlcyIseT0iYWJ1bmRhbmNlIixmaWxsID0gIlR5cGUiLGNvbG9yID0gIlR5cGUiLCB5bGFiID0gIk1lYW4gcHJvcG9ydGlvbiIsIGFscGhhID0gMC41LCBub3RjaCA9IEYsbGVnZW5kID0gInJpZ2h0IixmYWNldC5ieSA9ICJUaW1lX3R4IiwgcGFsZXR0ZSA9IGdldF9wYWxldHRlKHBhbGV0dGUgPSAiamFtYSIsNSkpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSkgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobmNvbD0xKSxjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkrIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKaGM1CmBgYAoKYGBge3IgZmlnLmhlaWdodD0xMH0KaGM2IDwtIGRmX2hjX21ldGFfdHlwZSAlPiUgCiAgZmlsdGVyKGhjX2dyb3VwPT02LCBUaW1lX3R4JWluJWMoIkRheSAtMSIsIldlZWsgMSIsIldlZWsgOSIpKSAlPiUgCiAgZ2dib3hwbG90KHg9ImZlYXR1cmVzIix5PSJhYnVuZGFuY2UiLGZpbGwgPSAiVHlwZSIsY29sb3IgPSAiVHlwZSIsIHlsYWIgPSAiTWVhbiBwcm9wb3J0aW9uIiwgYWxwaGEgPSAwLjUsIG5vdGNoID0gRixsZWdlbmQgPSAicmlnaHQiLGZhY2V0LmJ5ID0gIlRpbWVfdHgiLCBwYWxldHRlID0gZ2V0X3BhbGV0dGUocGFsZXR0ZSA9ICJqYW1hIiw1KSkgKyB0aGVtZShheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkrIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTUpKSArIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChuY29sPTEpLGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTEpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NykpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSArIHlsaW0oMCw1KQpoYzYKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTE1fQpoYzcgPC0gZGZfaGNfbWV0YV90eXBlICU+JSAKICBmaWx0ZXIoaGNfZ3JvdXA9PTcsIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIsIHBhbGV0dGUgPSBnZXRfcGFsZXR0ZShwYWxldHRlID0gImphbWEiLDUpKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NSkpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5jb2w9MSksY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MSkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmhjNwpgYGAKCgoKYGBge3IgZmlnLmhlaWdodD0xMH0KaGM4IDwtIGRmX2hjX21ldGFfdHlwZSAlPiUgCiAgZmlsdGVyKGhjX2dyb3VwPT04LCBUaW1lX3R4JWluJWMoIkRheSAtMSIsIldlZWsgMSIsIldlZWsgOSIpKSAlPiUgCiAgZ2dib3hwbG90KHg9ImZlYXR1cmVzIix5PSJhYnVuZGFuY2UiLGZpbGwgPSAiVHlwZSIsY29sb3IgPSAiVHlwZSIsIHlsYWIgPSAiTWVhbiBwcm9wb3J0aW9uIiwgYWxwaGEgPSAwLjUsIG5vdGNoID0gRixsZWdlbmQgPSAicmlnaHQiLGZhY2V0LmJ5ID0gIlRpbWVfdHgiLCBwYWxldHRlID0gZ2V0X3BhbGV0dGUocGFsZXR0ZSA9ICJqYW1hIiw1KSkgKyB0aGVtZShheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkrIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTUpKSArIGd1aWRlcyhmaWxsPWd1aWRlX2xlZ2VuZChuY29sPTEpLGNvbG9yPWd1aWRlX2xlZ2VuZChuY29sPTEpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NykpICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKQpoYzgKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEwfQpoYzkgPC0gZGZfaGNfbWV0YV90eXBlICU+JSAKICBmaWx0ZXIoaGNfZ3JvdXA9PTksIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIsIHBhbGV0dGUgPSBnZXRfcGFsZXR0ZShwYWxldHRlID0gImphbWEiLDUpKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NSkpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5jb2w9MSksY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MSkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpICsgeWxpbSgwLDEwKQpoYzkKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTEwfQpoYzEwIDwtIGRmX2hjX21ldGFfdHlwZSAlPiUgCiAgZmlsdGVyKGhjX2dyb3VwPT0xMCwgVGltZV90eCVpbiVjKCJEYXkgLTEiLCJXZWVrIDEiLCJXZWVrIDkiKSkgJT4lIAogIGdnYm94cGxvdCh4PSJmZWF0dXJlcyIseT0iYWJ1bmRhbmNlIixmaWxsID0gIlR5cGUiLGNvbG9yID0gIlR5cGUiLCB5bGFiID0gIk1lYW4gcHJvcG9ydGlvbiIsIGFscGhhID0gMC41LCBub3RjaCA9IEYsbGVnZW5kID0gInJpZ2h0IixmYWNldC5ieSA9ICJUaW1lX3R4IiwgcGFsZXR0ZSA9IGdldF9wYWxldHRlKHBhbGV0dGUgPSAiamFtYSIsNSkpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSkgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobmNvbD0xKSxjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkrIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKaGMxMApgYGAKYGBge3IgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTIwfQpoYzExIDwtIGRmX2hjX21ldGFfdHlwZSAlPiUgCiAgZmlsdGVyKGhjX2dyb3VwPT0xMSwgVGltZV90eCVpbiVjKCJEYXkgLTEiLCJXZWVrIDEiLCJXZWVrIDkiKSkgJT4lIAogIGdnYm94cGxvdCh4PSJmZWF0dXJlcyIseT0iYWJ1bmRhbmNlIixmaWxsID0gIlR5cGUiLGNvbG9yID0gIlR5cGUiLCB5bGFiID0gIk1lYW4gcHJvcG9ydGlvbiIsIGFscGhhID0gMC41LCBub3RjaCA9IEYsbGVnZW5kID0gInJpZ2h0IixmYWNldC5ieSA9ICJUaW1lX3R4IiwgcGFsZXR0ZSA9IGdldF9wYWxldHRlKHBhbGV0dGUgPSAiamFtYSIsNSkpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSkgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobmNvbD0xKSxjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkrIAogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKaGMxMQpgYGAKYGBge3IgZmlnLmhlaWdodD0xNSwgZmlnLndpZHRoPTIwfQpoYzEyIDwtIGRmX2hjX21ldGFfdHlwZSAlPiUgCiAgZmlsdGVyKGhjX2dyb3VwPT0xMiwgVGltZV90eCVpbiVjKCJEYXkgLTEiLCJXZWVrIDEiLCJXZWVrIDkiKSkgJT4lIAogIGdnYm94cGxvdCh4PSJmZWF0dXJlcyIseT0iYWJ1bmRhbmNlIixmaWxsID0gIlR5cGUiLGNvbG9yID0gIlR5cGUiLCB5bGFiID0gIk1lYW4gcHJvcG9ydGlvbiIsIGFscGhhID0gMC41LCBub3RjaCA9IEYsbGVnZW5kID0gInJpZ2h0IixmYWNldC5ieSA9ICJUaW1lX3R4IiwgcGFsZXR0ZSA9IGdldF9wYWxldHRlKHBhbGV0dGUgPSAiamFtYSIsNSkpICsgdGhlbWUoYXhpcy50aWNrcy54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X2JsYW5rKCkpKyB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT01KSkgKyBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobmNvbD0xKSxjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkrIAogIHRoZW1lKGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTcpKSAgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmhjMTIKYGBgCgpgYGB7ciBmaWcuaGVpZ2h0PTUsIGZpZy53aWR0aD0xMH0KaGMxNCA8LSBkZl9oY19tZXRhX3R5cGUgJT4lIAogIGZpbHRlcihoY19ncm91cD09MTQsIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIscGFuZWwubGFicyA9IGxpc3QoVGltZV90eD1jKCJMYWN0YXRpb24iLCJEcnktb2ZmIiwiRnJlc2ggY293cyIpKSkgKyB0aGVtZShheGlzLnRpY2tzLnggPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSkrICBndWlkZXMoZmlsbD1ndWlkZV9sZWdlbmQobmNvbD0xKSxjb2xvcj1ndWlkZV9sZWdlbmQobmNvbD0xKSkrIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0RGOEY0NEZGIiwiI0IyNDc0NUZGIikpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjREY4RjQ0RkYiLCIjQjI0NzQ1RkYiKSkKaGMxNApgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0yMH0KaGMxNSA8LSBkZl9oY19tZXRhX3R5cGUgJT4lIAogIGZpbHRlcihoY19ncm91cD09MTUsIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIsIHBhbGV0dGUgPSBnZXRfcGFsZXR0ZShwYWxldHRlID0gImphbWEiLDUpKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NSkpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5jb2w9MSksY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MSkpKyAKICB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSkgICsgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA5MCwgdmp1c3QgPSAwLjUsIGhqdXN0PTEpKSArIHlsaW0oMCwxMCkKaGMxNQpgYGAKCmBgYHtyIGZpZy5oZWlnaHQ9MTUsIGZpZy53aWR0aD0xNX0KaGMyOCA8LSBkZl9oY19tZXRhX3R5cGUgJT4lIAogIGZpbHRlcihoY19ncm91cD09MTQsIFRpbWVfdHglaW4lYygiRGF5IC0xIiwiV2VlayAxIiwiV2VlayA5IikpICU+JSAKICBnZ2JveHBsb3QoeD0iZmVhdHVyZXMiLHk9ImFidW5kYW5jZSIsZmlsbCA9ICJUeXBlIixjb2xvciA9ICJUeXBlIiwgeWxhYiA9ICJNZWFuIHByb3BvcnRpb24iLCBhbHBoYSA9IDAuNSwgbm90Y2ggPSBGLGxlZ2VuZCA9ICJyaWdodCIsZmFjZXQuYnkgPSAiVGltZV90eCIsIHBhbGV0dGUgPSBnZXRfcGFsZXR0ZShwYWxldHRlID0gImphbWEiLDUpKSArIHRoZW1lKGF4aXMudGlja3MueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpKSsgdGhlbWUobGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9NSkpICsgZ3VpZGVzKGZpbGw9Z3VpZGVfbGVnZW5kKG5jb2w9MSksY29sb3I9Z3VpZGVfbGVnZW5kKG5jb2w9MSkpKyAKICB0aGVtZShsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCmhjMjgKYGBgCgoKYGBge3J9CnNldHdkKCIvVXNlcnMva2FybGF2YXNjby9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9PbmVEcml2ZS1NaWNoaWdhblN0YXRlVW5pdmVyc2l0eS9NYW5uaW5nX2xhYi9NZXRhYm9sb21pY3NfbWFzdGl0aXMvZmlndXJlcyIpCiNnZ3NhdmUocGxvdD1oYzEsImhjMV9tdWx0aW9taWNzLnBuZyIsd2lkdGggPSAxNiwgaGVpZ2h0ID0gOCkKZ2dzYXZlKHBsb3Q9aGMyLCJoYzJfbXVsdGlvbWljcy5wbmciLHdpZHRoID0gMzAsIGhlaWdodCA9IDIwKQojZ2dzYXZlKHBsb3Q9aGMzLCJoYzNfbXVsdGlvbWljcy5wbmciLHdpZHRoID0gMjAsIGhlaWdodCA9IDIwKQojZ2dzYXZlKHBsb3Q9aGM0LCJoYzRfbXVsdGlvbWljcy5wbmciLHdpZHRoID0gMTYsIGhlaWdodCA9IDgpCmdnc2F2ZShwbG90PWhjNSwiaGM1X211bHRpb21pY3MucG5nIix3aWR0aCA9IDMwLCBoZWlnaHQgPSAyMCkKI2dnc2F2ZShwbG90PWhjMTQsImhjMTRfbXVsdGlvbWljcy5wbmciLHdpZHRoID0gMTYsIGhlaWdodCA9IDIwKQojZ2dzYXZlKHBsb3Q9aGMxNSwiaGMxNV9tdWx0aW9taWNzLnBuZyIsd2lkdGggPSAxNiwgaGVpZ2h0ID0gMjApCmBgYAoKYGBge3J9CnNldHdkKCIvVXNlcnMva2FybGF2YXNjby9MaWJyYXJ5L0Nsb3VkU3RvcmFnZS9PbmVEcml2ZS1NaWNoaWdhblN0YXRlVW5pdmVyc2l0eS9NYW5uaW5nX2xhYi9NZXRhYm9sb21pY3NfbWFzdGl0aXMvZmlndXJlcyIpCgpoY19iYXJzIDwtIGdnYXJyYW5nZShoYzEsaGMxNCxoYzMsbGFiZWxzID0gYygiQSIsIkIiLCJDIiksbnJvdyA9IDMsIG5jb2wgPSAxKQpnZ3NhdmUocGxvdD1oY19iYXJzLCJoY19iYXJzX2ZjX211bHRpb21pY3MucG5nIix3aWR0aCA9IDE1LCBoZWlnaHQgPSAxNSkKCmBgYAoK